<?php

/**
 * SmartPHP framework
 *
 * @name SmartPHP framework
 * @package SmartPHP
 * @author 费尔 <admin@smartphp.cn>
 * @version 1.0 Beta
 * @link http://www.smartphp.cn
 * @copyright smartphp.cn
 * @license <a href="http://www.smartphp.cn">smartphp</a>
 */

namespace Base;

/**
 * 错误管理
 * @author 费尔 <admin@xuai.cn>
 */
class Error {

    public static $errorTypes = array(
        E_ERROR => 'E_ERROR',
        E_WARNING => 'E_WARNING',
        E_PARSE => 'E_PARSE',
        E_NOTICE => 'E_NOTICE',
        E_CORE_ERROR => 'E_CORE_ERROR',
        E_CORE_WARNING => 'E_CORE_WARNING',
        E_COMPILE_ERROR => 'E_COMPILE_ERROR',
        E_COMPILE_WARNING => 'E_COMPILE_WARNING',
        E_USER_ERROR => 'E_USER_ERROR',
        E_USER_WARNING => 'E_USER_WARNING',
        E_USER_NOTICE => 'E_USER_NOTICE',
        E_STRICT => 'E_STRICT'
    );

    /**
     * 注册异常处理
     * @return void
     */
    public static function init() {
        ini_set('display_errors', 'On');
        error_reporting(E_ALL);
        ini_set('html_errors', 0);

        set_error_handler([__CLASS__, 'appError']);
        set_exception_handler([__CLASS__, 'appException']);
        register_shutdown_function([__CLASS__, 'appShutdown']);
    }

    /**
     * Exception Handler
     * @param  \Exception|\Throwable $e
     */
    public static function appException($e) {
        self::appError($e->getCode(), $e->getMessage(), $e->getFile(), $e->getLine());
    }

    /**
     * Error Handler
     * @param  integer $errorno   错误编号
     * @param  integer $errormsg  详细错误信息
     * @param  string  $errorfile 出错的文件
     * @param  integer $errorline 出错行号
     * @param array    $errorcontext
     * @throws ErrorException
     */
    public static function appError($errorno, $errormsg, $errorfile, $errorline = 0, $errorcontext = []) {
        Log::error($errormsg . $errorfile . '[' . $errorline . ']');
        Config::get('debug.error') && APP_DEBUG && Debug::error($errorno, $errormsg, $errorfile, $errorline, $errorcontext);
    }

    /**
     * Shutdown Handler
     */
    public static function appShutdown() {
        // 写入日志
        Log::save();
    }

}
